package projeto.model;

/**
 * 
 * @author Javatar
 * Classe com função de criar estabelecimentos, nela guardamos informações
 * necessarias sobre os estabelecimentos, são elas: nome, endereço, popularidade, 
 * tipo de refeição servida.
 */
public class Estabelecimento {
	private int popularidade;
	private String nome,endereco;
	private TipoDeRefeicao tipoDeRefeicao;
	
	
	/**
	 * Construtor da classe Estabelecimento, onde serão salvos as informações do Estabelecimento, como nome, endereço e tipo de refeição servido.
	 * @param nome - Nome do estabelecimento(String);
	 * @param endereco - Endereço do estabelecimento(String);
	 * @param tipoDeRefeicao - Tipo de refeição servido no estabelecimento(String);
	 * @throws Exception - Casos de exceções para o estabelecimento, como nome invalido, endereço invalido ou tipo de refeição inválida.
	 */
	public Estabelecimento(String nome,String endereco,String tipoDeRefeicao) throws Exception{
		setNome(nome);
		setEndereco(endereco);
		setTipoDeRefeicao(tipoDeRefeicao);
		
	}
	/**
	 * Método que retorna o nome do Estabelecimento.
	 * @return nome - String na qual se refere ao nome do Estabelecimento instanciado.
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * Método que seta um nome para o estabelecimento referente, podendo mudar o nome do estabelecimento
	 * e também utilizado no construtor, para criar o nome do estabelecimento.
	 * @param nome - String referente ao nome que será setado no estabelecimento;
	 * @throws Exception - Exceção que pode ser lançada quando nome for null ou vazio.
	 */
	public void setNome(String nome) throws Exception {
		
		if(nome == null)
			throw new Exception("Nome Nulo.");
		
		if(nome.trim().equals(""))
			throw new Exception("Nome invalido");
		
		this.nome = nome;
	}
	/**
	 * Método que retorna o endereço do Estabelecimento.
	 * @return endereco - String na qual se refere ao endere?o do Estabelecimento instanciado.
	 */
	public String getEndereco() {
		return endereco;
	}
	/**
	 * Método que seta um endereço para o estabelecimento referente, podendo mudar o endereço do estabelecimento
	 * e também utilizado no construtor, para criar o endereço do estabelecimento.
	 * @param nome - String referente ao endereço que será setado no estabelecimento;
	 * @throws Exception - Exceção que pode ser lançada quando endereço for null ou vazio.
	 */
	public void setEndereco(String endereco) throws Exception {

		if(endereco == null)
			throw new Exception("Endereco nulo.");
		
		if(endereco.trim().equals(""))
			throw new Exception("Endereco invalido");
		
		this.endereco = endereco;
	}
	/**
	 * Método que retorna o tipo de refeição servido no Estabelecimento.
	 * @return tipoDeRefeicao - TipoDeRefeicao(Enum) na qual se refere ao tipo de refeição servido no Estabelecimento instanciado.
	 */
	public TipoDeRefeicao getTipoDeRefeicao() {
		return tipoDeRefeicao;
	}
	/**
	 * Método que seta um tipo de refeição servido para o estabelecimento referente, podendo mudar o tipo de refeição servido do estabelecimento
	 * e também utilizado no construtor, para criar o tipo de refeição do estabelecimento.
	 * @param tipoDeRefeicao - String referente ao tipo de refeição que será setado no estabelecimento;
	 * @throws Exception - Exceção que pode ser lan?ada quando tipo de refeição for null ou invalida.
	 */
	public void setTipoDeRefeicao(String tipoDeRefeicao)throws Exception {
		
		if(tipoDeRefeicao == null)
			throw new Exception("tipoDeRefeicao nula.");
		
		if(tipoDeRefeicao.equals(TipoDeRefeicao.PRATO_FEITO.getTipoRefeicao()))
			this.tipoDeRefeicao = TipoDeRefeicao.PRATO_FEITO;
		
		else if(tipoDeRefeicao.equals(TipoDeRefeicao.A_LA_CARTE.getTipoRefeicao()))
			this.tipoDeRefeicao = TipoDeRefeicao.A_LA_CARTE;
		
		else if(tipoDeRefeicao.equals(TipoDeRefeicao.SELF_SERVICE.getTipoRefeicao()))
			this.tipoDeRefeicao = TipoDeRefeicao.SELF_SERVICE;
		
		else
			throw new Exception("Erro. tipo de refeicao invalido.");
			
	}
	/**
	 * Método que retorna a popularidade do estabelecimento do Estabelecimento.
	 * @return popularidade - int no qual se refere a popularidade do Estabelecimento instanciado.
	 */
	public int getPopularidade() {
		return popularidade;
	}
	/**
	 * Método que seta uma popularidade para o estabelecimento referente, podendo mudar a popularidade do estabelecimento.
	 * @param popularidade - int referente a popularidade que ser? setado no estabelecimento;
	 */
	public void setPopularidade(int popularidade){
		this.popularidade = popularidade;
	}
	/**
	 * Método toString que retorna uma representação textual do Objeto da seguinte forma:
	 * nome + " " + endereco + " " + tipoDeRefeicao.getTipoRefeicao()
	 * 
	 */
	public String toString(){
		return nome + " " + endereco + " " + tipoDeRefeicao.getTipoRefeicao();
	}	
}